[Design Pattern] Iterator

[디자인 패턴][행위 패턴] 이터레이터

Posted by ChaelinJ on May 05, 2021

Iterator

내부 표현부를 노출하지 않고, 집합 객체에 속한 원소들을 순차적으로 접근할 수 있는 방법을 제공하는 패턴

  • 다양한 자료 구조들에 통일적으로 접근하는 방식을 제공

다이어그램

  • Iterator: 집합체 내의 요소들을 순서대로 검색하기 위한 인터페이스
  • ConctreteIteraotr: Iterator 인터페이스 구현
  • Aggregate: 여러 요소들이 이루어져 있는 집합체
  • ConcreteAggregate: Aggregate를 구현하는 클래스 - 집합체

예시와 예제

Aggregate로 집합체의 기본 기능을 구현한 후, Iterator로 순환하는 것을 구현 해보았습니다.

Java의 Collection을 생각하면서 만들었습니다.

Aggregate & ConcreteAggregate

내부에서 최대 사이즈를 저장하고, 배열을 이용해 저장하지만 ArrayList처럼 객체를 입력받아 저장하고 삭제하고 하는 동작을 합니다.

iterator() 메소드를 사용하면, 자기 객체를 넘기면서 생성한 ConcreteIterator를 반환합니다.

Iterator & ConcreteIterator

Iterator의 hasNext, next를 이용해 iterator에서는 내부 ConcreteAggregater에 접근하지 않고 출력 하는 등의 순차적 동작이 가능합니다.

Iterator를 통한 remove는 iterator가 현재 가리키는 index의 것을 삭제하고 다음으로 넘어갑니다.

Main

ConcreteAggregate에서 Object 형태로 배열을 지정해서 Integer, String 등 다양한 클래스가 저장될 수 있습니다.

출력

Integer List------------
1
2
3
String List1-------------
hi
there
bye
String List2-------------
remove
bye

단순히 구현했지만 구현하려한 부분은 잘 구현되었습니다.

연관된 자바 코드를 예시로 보겠습니다. 사실 직접 구현하기 보단 구현된 Collection을 이용할 경우가 더 많기 때문에 같이 보고 넘어가면 좋을 것 같습니다.

public interface Collection<E> extends Iterable<E> {}

위처럼 Iterable을 extends합니다.

Iterable을 따라가보면 다음처럼 Aggregate와 비슷합니다.

public interface Iterable<T> {
    /**
     * Returns an iterator over elements of type {@code T}.
     *
     * @return an Iterator.
     */
    Iterator<T> iterator();
    ...
}

또 저기서 Iterator는 위의 예제와 같이 hasNext, next 등의 메소드를 가지고 있습니다.

Iterator 패턴 장단점 및 특징

장점

  • 서로 다른 집합 객체 구조에 대해서 동일한 순회 방법을 제공합니다.
  • 객체 순회 내부 표현 방식을 알지 않아도 접근해 순회할 수 있습니다.
  • 집합체의 구현과 접근하는 처리 부분을 분리해 결합도를 줄입니다.
    • Client에서 iterator로 접근하기 때문에 ConcreteAggregate 내에 수정 사항이 생겨도 iterator에 문제가 없다면 문제가 발생하지 않습니다.

단점

  • 구현 방법에 따라 캡슐화를 위배할 수 있기 때문에 주의해야 합니다.
  • 간단한 코드의 경우, 코드가 복잡해 질 수 있습니다.

유지보수가 필요한 장기간 이용되는 코드의 경우, 결합도를 낮출 수 있는 Iterator를 이용하는 것이 효율적입니다.


참조

감사합니다.

Text by Chaelin. Photographs by Chaelin, Unsplash.